package ZengJiHong1.Test2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * @ClassName 托尔斯泰
 * @Author 16799
 * @Date 2025/8/14 18:33
 * @Version 1.0
 * @Description TODO
 *
 * User 实体类，包含如下属性
 *   - private Long id;  // 用户id 名
 *   - private String gender;  //性别
 *   - private LocalDate birthday;  //生日
 *   - 注意需要提供 set和get方法，以及toString方法
 *新建测试类，类中 main 方法，在方法中完成如下业务逻辑：
 *  业务一：
 * - 有如下字符串，里面包含多个用户信息数据，现在需要你解析这个字符串，获取里面的用户数据，并封装到User对象中
 *   多个User对象在添加到List<User> 集合中
 * 注意：
 * - 字符串中的规则如下，多个用户用 # 拼接，用户的信息之间用 : 拼接。
 * - 其中用户id和生日是需要进行类型转换的，其中id需要将String转成Long，生日需要将String转成LocalDate
 *
 *  业务二：
 * - 遍历上面获取的List<User> 集合，统计里面每个名字出现的次数。
 * - 封装到Map<String,Integer>集合中，集合的key就是名字，value就是名字出现的次数。
 * - 最后遍历打印map数据，打印内容如下：
 *   - 张三：3次
 *   - 李四：5次
 *
 *  时间：2025年8月15日17:42:28
 *          14分
 **/
public class test2 {
    public static void main(String[] args)  {
        //存user对象的list集合
        List<User> users = new ArrayList<>();

        //存users集合里面的各个名字和各个名字出现的次数
        Map<String,Integer> cishu = new HashMap<>();

        String userStrs = "10001:张三:男:1990-01-01#10002:李四:女:1989-01-09#10003:王五:男:1999-09-09" +
                "#10004:刘备:男:1899-01-01#10005:孙悟空:男:1900-01-01#10006:张三:女:1999-01-01" +
                "#10007:刘备:女:1999-01-01#10008:张三:女:2003-07-01#10009:猪八戒:男:1900-01-01";

        String[] splits = userStrs.split("#");
        System.out.println("按照#切割好的字符串： ");
        System.out.println(Arrays.toString(splits));
        //创建简单日期格式化对象，结果是：不行
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        //创建一个日期格式化对象
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        //遍历按照#切割好的数组
        for (int i = 0; i < splits.length; i++) {
            //将分割好的数组，按照：再分割为单独的数组
            String[] UserData= splits[i].split(":");
            //这样会报错，因为user实体类里面id是long类型，birthday是LocalDate类型，但是我提供的数组值都是string类型
            //users.add(new User(UserData[0],UserData[1],UserData[2],UserData[3]));

            //还是需要单独用不同的变量，把分割好的数组里面的每一个元素拿出来保存
            Long id = Long.valueOf(UserData[0]);        //包装类，自动装箱(把基本数据类型自动转换为对应的包装类)都是通过包装类的valueOf（）方法来实现的
            String name = UserData[1];
            String gender = UserData[2];
       /*     //这样也行，也可以获得字符串里面的时间，不要格式化器，DateTimeFormatter或者SimpleDateFormat
            LocalDate bir = LocalDate.parse(UserData[3]);*/

         /*   //换一种，用简单日期格式化对象格式化器的：不行，user实体类是LocalDate类型，并且这种方式还需要throws ParseException
            Date bir = sdf1.parse(UserData[3]);*/

            //再换一种，用日期格式化对象DateTimeFormatter可以识别时间字符串，也不用抛异常
            LocalDate bir = LocalDate.parse(UserData[3],formatter);

            //然后就是把保存的数据new对象
            users.add(new User(id,name,gender,bir));
        }

        System.out.println("存入的所有用户结果： ");
        System.out.println(users);

        for (int i = 0; i < users.size(); i++) {
            User u = users.get(i);
            String name = u.getName();
            //我刚开始在想，遍历这个users集合后，拿到每一个名字第一次出现后，然后在里面套一个for循环再次遍历，
            // 和集合里面的其他元素遍历equals对比，有相同的就+1记录出现次数，然后再从集合中删掉，但是根据很麻烦，写不出来
            //突然想到Day07的d5案例有说过类似的，想起来用map：哈哈哈哈
            if (cishu.containsKey(name)){
                cishu.put(name,cishu.get(name)+1);
            }else {
                cishu.put(name,1);
            }
        }

        System.out.println("最终结果的map： ");
        System.out.println(cishu);

    }
}
